#ifndef STRUCTURES_DEF
#define STRUCTURES_DEF


//===================DEFINITION DES TYPEDEF ==============================

typedef enum _type_operun {NEG,OPP} Type_operun ;

typedef enum  _type_operbin {PLUS,MOINS,MULT,DIV,MOD,EG,INF,
		SUP,INFE,SUPE,DIFF,ET,OU} Type_operbin;
		
typedef enum _type_expr {INT, VAR, STR,OPBIN,OPUN}	Type_expr;

typedef enum _type_inst {REM,GOTO,LET,PRINT,INPUT,IF} Type_inst;

typedef struct _un_operun Un_operun ;

typedef struct _un_operbin Un_operbin ;

typedef struct _une_expr Une_expr ;

typedef struct _une_inst Une_inst;

typedef struct _une_var Une_var;

typedef struct _un_label Un_label;

typedef struct _un_prog Un_prog;


//===============================DEFNITION DES STRUCTURES================

struct _un_operun
{
	Type_operun type;
	Une_expr *pexpr; //operande
};

struct _un_operbin
{
	Type_operbin type;
	Une_expr *pexpr1; //operande 1
	Une_expr *pexpr2; //operande 2 
};

struct _une_expr
{
	Type_expr type;
	int val ; 
	Une_var *pvar;
	char *str;
	Un_operun *poperun;
	Un_operbin *poperbin;
};

struct _une_inst
{
	Type_inst type;
	char* rem_str;
	Un_label *branch_lab; 
	Une_var *pvar;
	Une_expr *pexpr;
	Une_inst *suiv;
};

struct _une_var
{
	char *nom_var;
	int val_var;
	Une_var *suiv;
};

struct _un_label
{
	char* nom_label;
	Une_inst *pinst;
	Un_label *suiv;
};

struct _un_prog
{
	Une_inst *pinst;
	Une_var *pvar ;
	Un_label *plabel;
};










#endif

